package org.common.utils.net.netty.http.intercept;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import org.common.utils.net.netty.http.core.HttpRequest;
import org.common.utils.net.netty.http.intercept.entity.FaviconIntercept;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 拦截器池
 * @author zhouzhibing
 * @date 2025/11/23 17:40
 */
public class HttpInterceptPool {

    /**
     * 拦截器列表
     */
    private final List<HttpIntercept> events = new CopyOnWriteArrayList<>();

    public HttpInterceptPool() {
        events.add(new FaviconIntercept());
    }


    /**
     * 处理最开始，读取请求时的调用
     * @param request 请求
     * @return false处理不成功，表示被拦截，是否继续向下执行。
     */
    public boolean channelReadStart(ChannelHandlerContext ctx, FullHttpRequest request) {
        for (HttpIntercept event : events) {
            if (!event.channelReadStart(request)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 功能调用前。
     * @param request 请求
     * @return false处理不成功，表示被拦截，是否继续向下执行。
     */
    public boolean handlerRequestBefore(HttpRequest request) {
        for (HttpIntercept event : events) {
            if (!event.handlerRequestBefore(request)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 添加拦截器
     * @param interceptor 拦截器
     */
    public void addInterceptor(HttpIntercept interceptor) {
        events.add(interceptor);
    }

    /**
     * 移除拦截器
     * @param interceptor 拦截器
     */
    public void removeInterceptor(HttpIntercept interceptor) {
        events.remove(interceptor);
    }

}
